package com.itheima.youdianda.utils;

import com.alibaba.druid.util.StringUtils;
import com.itheima.youdianda.exception.CustomException;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author Pan Rundong
 * @Date 2023-02-10 18:47
 * @Desc token工具类
 */
@Component
public class JwtUtils {

    /**
     *  TOKEN的有效期30分钟（S）
     */

    private static int TOKEN_TIME_OUT;

    /**
     * 加密KEY
     */
    private static String TOKEN_SECRET;

    @Value("${YouDianDa.Jwt.time}")
    private void setTokenTimeOut(int tokenTimeOut) {
        JwtUtils.TOKEN_TIME_OUT = tokenTimeOut;
    }
    @Value("${YouDianDa.Jwt.secret}")
    private void setTokenSecret(String tokenSecret) {
        JwtUtils.TOKEN_SECRET = tokenSecret;
    }

    /**
     * 生成Token
     * @Author: Pan Rundong
     * @Date: 2023-02-10 18:52
     * @Greet2u:  （O｀ 3′O）~~♡
     * @param params
     * @return java.lang.String
     */
    public static Map giveToken(Map params){
        Map newMap = new HashMap();
        long currentTime = System.currentTimeMillis();
        String token = Jwts.builder()
                //加密方式
                .signWith(SignatureAlgorithm.HS512, TOKEN_SECRET)
                //过期时间戳
                .setExpiration(new Date(currentTime + TOKEN_TIME_OUT * 1000))
                .addClaims(params)
                .compact();
        newMap.put("token",token);
        return newMap;
    }


    /**
     * 获取Token中的claims信息
     * @Author: Pan Rundong
     * @Date: 2023-02-10 18:53
     * @Greet2u:  （O｀ 3′O）~~♡
     * @param token
     * @return io.jsonwebtoken.Claims
     */
    public static Claims getClaims(String token) {
        return Jwts.parser()
                .setSigningKey(TOKEN_SECRET)
                .parseClaimsJws(token)
                .getBody();
    }


    /**
     * 是否有效 true-有效，false-失效
     * @Author: Pan Rundong
     * @Date: 2023-02-10 18:53
     * @Greet2u:  （O｀ 3′O）~~♡
     * @param token
     * @return boolean
     */
    public static boolean verifyToken(String token) {
        //检测token是否为空
        if(StringUtils.isEmpty(token)) {
            return false;
        }
        //检测token是否合法或过期
        getClaims(token);
        return true;
    }

    /**
     * 解析token获取用户Id
     *
     * @param token
     * @return java.lang.String
     * @Author: Pan Rundong
     * @Date: 2023-02-12 14:09
     * @Greet2u: （O｀ 3′O）~~♡
     */
    public static Object getUserValue(String token, String value) {
        //判定token是否为空
        if (!verifyToken(token)) {
            throw new CustomException("token为空");
        }
        Claims claims = getClaims(token);
        Object userValue = claims.get(value);
        return userValue;
    }

}
